package com.hongyi.common.framework.utils.common;

import com.hongyi.common.framework.utils.string.StringUtils;

import java.util.Iterator;
import java.util.Map;

/**
 * Object工具类
 *
 * @author DingHao
 */
public class ObjectUtils {


    /**
     * 检查对象是否为null<br>
     * 判断标准为：
     *
     * <pre>
     * 1. == null
     * 2. equals(null)
     * </pre>
     *
     * @param obj 对象
     * @return 是否为null
     */
    public static boolean isNull(Object obj) {
        return null == obj || obj.equals(null);
    }

    /**
     * 检查对象是否不为null
     * <pre>
     * 1. != null
     * 2. not equals(null)
     * </pre>
     *
     * @param obj 对象
     * @return 是否为非null
     */
    public static boolean isNotNull(Object obj) {
        return null != obj && false == obj.equals(null);
    }


    /**
     * 判断指定对象是否为空，支持：
     *
     * <pre>
     * 1. CharSequence
     * 2. Map
     * 3. Iterable
     * 4. Iterator
     * 5. Array
     * </pre>
     *
     * @param obj 被判断的对象
     * @return 是否为空，如果类型不支持，返回false
     */
    public static boolean isEmpty(Object obj) {
        if (null == obj) {
            return true;
        }
        if (obj instanceof CharSequence) {
            return StringUtils.isEmpty((CharSequence) obj);
        } else if (obj instanceof Map) {
            return MapUtils.isEmpty((Map) obj);
        } else if (obj instanceof Iterable) {
            return IterUtils.isEmpty((Iterable) obj);
        } else if (obj instanceof Iterator) {
            return IterUtils.isEmpty((Iterator) obj);
        } else if (ArrayUtils.isArray(obj)) {
            return ArrayUtils.isEmpty(obj);
        }

        return false;
    }

    /**
     * 判断指定对象是否为非空，支持：
     *
     * <pre>
     * 1. CharSequence
     * 2. Map
     * 3. Iterable
     * 4. Iterator
     * 5. Array
     * </pre>
     *
     * @param obj 被判断的对象
     * @return 是否为空，如果类型不支持，返回true
     */
    public static boolean isNotEmpty(Object obj) {
        return false == isEmpty(obj);
    }

    /**
     * 判断空值并创建新对象
     *
     * @param object 判断对象
     * @param defaultValue 默认对象
     */
    public static <T> T defaultIfNull(T object, T defaultValue) {
        return isNull(object) ? defaultValue : object;
    }

}
